package dis.servlet.log;

import dis.bean.Proyecto;
import dis.bean.Usuario;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;
import dis.service.ServiceColors;

/**
 *Servlet que se encarga de la notificación de los nuevos usuarios conectados y el total de usuarios conectados.
 * @author Pashi
 */
public class LogServlet extends HttpServlet {
    static int usuarios=0;    
    private static Proyecto[] proyectos=new Proyecto[100];
    static Usuario lastUser=new Usuario();
    static Usuario lastDesconected=new Usuario();
    private ServiceColors srv = new ServiceColors();
  /*  private javax.swing.Timer timer = new javax.swing.Timer (1500, new ActionListener () { 
        @Override
                public void actionPerformed(ActionEvent e) 
                {   lastUser=null; 
                    lastDesconected=null;
                } });*/
    
    public static Vector<Usuario> usuariosLogueados = new Vector<Usuario>();
    
    /*Método que procesa la petición del usuario y escoge el método a utilizar*/
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            String nombreMetodo = request.getParameter("metodo");
            if(nombreMetodo!=null){
                if(nombreMetodo.compareTo("login") == 0) {
                    login(response);
                }else if(nombreMetodo.compareTo("logout") == 0) {
                    logout(response);
                }else if(nombreMetodo.compareTo("add") == 0) {
                    try {
                        add(response,request.getParameter("objeto"));
                    } catch (ParseException ex) {
                        System.out.println("Error");                    
                    }
                }else if(nombreMetodo.compareTo("quit") == 0) {
                    try {
                        quit(response,request.getParameter("objeto"));
                    } catch (ParseException ex) {
                            System.out.println("Error"); 
                    }
                }else if(nombreMetodo.compareTo("getUsers") == 0) {
                    try {            
                        getUsers(response,request.getParameter("objeto"));
                    } catch (ParseException ex) {
                        System.out.println("Error");
                    }
                }
            } 
    }
       
    /*Método que imprime la notificación del logueo de un nuevo usuario*/
    private void login(HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8"); 
        JSONObject jsonResponse =  new JSONObject();       
        PrintWriter out = response.getWriter();
        if(lastUser!=null){
        jsonResponse.put("idUsuario", lastUser.getId());
        jsonResponse.put("nombreUsuario", lastUser.getNombre());
        jsonResponse.put("idProyecto", lastUser.getIdProyecto()); 
        }
        out.println(jsonResponse.toString());        
        out.close();
    }
 
    /*Método que imprime la desconexión del usuario*/
    private void logout(HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=UTF-8"); 
        JSONObject jsonResponseD =  new JSONObject();
        if(lastDesconected!=null){
        jsonResponseD.put("idUsuario", lastDesconected.getId());
        jsonResponseD.put("nombreUsuario", lastDesconected.getNombre());
        jsonResponseD.put("idProyecto", lastDesconected.getIdProyecto());            
        }
        PrintWriter out = response.getWriter();
        out.println(jsonResponseD.toString());
        out.close();
    }

    /*Método que sirve para obtener el usuario dueño de la página desde el html, jsp, etc*/
    private void getUsers(HttpServletResponse response, String jsonString) throws IOException, ParseException{
        response.setContentType("text/html;charset=UTF-8"); 
        JSONObject json =  new JSONObject(jsonString); 
        JSONObject jsonResponse =  new JSONObject();  
        int idProyecto=json.getInt("idProyecto");   
        PrintWriter out = response.getWriter();  
        if(proyectos[idProyecto]!=null){            
            for(int i=0;i<proyectos[idProyecto].getUsuarios().length;i++){
                if(proyectos[idProyecto].getUsuarios()[i]!=null){
                    jsonResponse.put("idProyecto",idProyecto);
                    jsonResponse.put("idUsuario", proyectos[idProyecto].getUsuarios()[i].getId());
                    jsonResponse.put("nombreUsuario", proyectos[idProyecto].getUsuarios()[i].getNombre());
                    out.println(jsonResponse.toString());
                }
            }
        }else{
            jsonResponse.put("usuarios","ninguno");            
            out.println(jsonResponse.toString());   
        }
        out.close();
    }
    
    /*Método que sirve para agregar un nuevo usuario logueado durante el login*/
    private void add(HttpServletResponse response,String jsonString) throws IOException, ParseException{
       JSONObject json =  new JSONObject(jsonString);
       Usuario user= new Usuario();
       user.setId(json.getInt("idUsuario"));
       user.setNombre(json.getString("nombreUsuario"));
       usuarios++;
       int idProyecto=json.getInt("idProyecto");       
       user.setColor(srv.getColorRandom());
       boolean band=false;
       for(Usuario usern:usuariosLogueados){
           if(user.getId()==usern.getId()){
               band=true;
               break;
            }
       }
       if(!band){       
            usuariosLogueados.add(user);
       }
       user.setIdProyecto(idProyecto);
       if(proyectos[idProyecto]==null){
            proyectos[idProyecto]=new Proyecto();
       }
       lastUser=user;       
       proyectos[idProyecto].setUsuario(user.getId(),lastUser);
           
     //   timer.start();
    }
    
    /*Método que sirve para eliminar al usuario desconectado*/
    private void quit( HttpServletResponse response,String jsonString) throws IOException, ParseException {
        JSONObject json =  new JSONObject(jsonString);   
        int idProyecto=json.getInt("idProyecto");
        usuarios--;
        lastDesconected.setId(json.getInt("idUsuario"));
        lastDesconected.setNombre(proyectos[idProyecto].getUsuarios()[lastDesconected.getId()].getNombre());
        lastDesconected.setIdProyecto(idProyecto);
        proyectos[idProyecto].setUsuario(lastDesconected.getId(),null);     
        
      //  timer.start();
    }
        
    /*Método que procesa las peticiones de tipo get*/
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    /*Método que procesa las peticiones de tipo post*/
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}